package com.example.spring.test;

/**
 * Synchronized是Java中解决并发问题的一种最常用的方法，也是最简单的一种方法。Synchronized的作用主要有三个：
 * （1）确保线程互斥的访问同步代码
 * （2）保证共享变量的修改能够及时可见
 * （3）有效解决重排序问题
 */
public class SynchronizedDemo {

    public static void main(String[] args) {
        SynchronizedDemo demo = new SynchronizedDemo();
        demo.method();
    }

    /**
     * Synchronized是通过对象内部的一个叫做监视器锁（monitor）来实现的。但是监视器锁本质又是依赖于底层的操作系统的Mutex Lock来实现的。
     * 而操作系统实现线程之间的切换这就需要从用户态转换到核心态，这个成本非常高，状态之间的转换需要相对比较长的时间，这就是为什么Synchronized效率低的原因。
     * 因此，这种依赖于操作系统Mutex Lock所实现的锁我们称之为“重量级锁”。
     */
    public void method() {
        synchronized (this) {
            System.out.println(this.hashCode()+"==="+SynchronizedDemo.class.hashCode());
            System.out.println("Method 1 start");
        }
    }
}

